package cn.infrabase;

/**
 * 全局标识。
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
public class Gid {

	/**
	 * 全局标识长度。
	 */
	public static final int LENGTH = 24;

	/**
	 * 构造函数。
	 */
	private Gid() {
		super();
	}

	/**
	 * 全局标识的值。
	 */
	private String value;

	/**
	 * 返回全局标识的值。
	 *
	 * @return 全局标识的值。
	 */
	public String getValue() {
		return value;
	}

	/**
	 * 返回全局标识的值。
	 *
	 * @return 全局标识的值。
	 */
	public String value() {
		return getValue();
	}

	/**
	 * 返回一个全局标识。
	 *
	 * @return 全局标识对象。
	 */
	public static Gid get() {
		Gid ret = new Gid();
		ret.value = ObjectId.get().toHexString();
		return ret;
	}

	/**
	 * 返回全局标识对象。
	 *
	 * @param gid 全局标识值。
	 * @return 全局标识对象。
	 * @throws GidInvalidException 如果给定的全局标识无效时。
	 */
	public static Gid of(String gid) throws GidInvalidException {
		isValid(gid);
		Gid ret = new Gid();
		ret.value = gid;
		return ret;
	}

	/**
	 * 断言给定的全局标识值有效。
	 *
	 * @param gid 给定的全局标识值。
	 * @return 真表示给定的全局标识值有效。
	 */
	public static boolean isValid(String gid) {
		if (gid == null || gid.length() != LENGTH) {
			throw new GidInvalidException(gid);
		}
		return ObjectId.isValid(gid);
	}

}
